<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
            "http://www.w3.org/TR/REC-html40/loose.dtd">
<HTML>
<HEAD>



<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<META name="GENERATOR" content="hevea 1.08">
<LINK rel="stylesheet" type="text/css" href="tutorial.css">
<TITLE>
Debugging the Program
</TITLE>
</HEAD>
<BODY >
<A HREF="tutorial039.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="tutorial037.html"><IMG SRC ="contents_motif.gif" ALT="Up"></A>
<A HREF="tutorial041.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
<HR>

<H2 CLASS="section"><A NAME="htoc80">5.3</A>&nbsp;&nbsp;Debugging the Program</H2>
The main tool to debug a program is the <B>tracer</B> tool. The tracer is
one of the development tools, all of which can be accessed from the <TT>Tools</TT> menu of
TkECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP>. Select <TT>Tracer</TT> from the
menu as shown below, and a new window for the tracer tool should appear.<BR>
<BR>
<DIV CLASS="center">
<IMG SRC="tutorial004.gif"><BR>
<BR>
<BR>

<B>Starting the Tracer Tool</B>
</DIV>
Run the query <CODE>colour</CODE> again. To save you from typing in the query,
you can use the up-arrow on your keyboard to step back to a previous query.
Type return when <CODE>colour</CODE> appears in the query window again.<BR>
<BR>

<BLOCKQUOTE CLASS="figure"><DIV CLASS="center"><HR WIDTH="80%" SIZE=2></DIV>
<DIV CLASS="center">
<IMG SRC="tutorial005.gif">
</DIV>
<BR>
<BR>
<DIV CLASS="center">Figure 5.2: The Tracer Tool</DIV><BR>
<BR>

<A NAME="tktracer"></A>
<DIV CLASS="center"><HR WIDTH="80%" SIZE=2></DIV></BLOCKQUOTE>

<A NAME="@default124"></A>
<A NAME="@default125"></A>

	<BLOCKQUOTE CLASS="figure"><DIV CLASS="center"><HR WIDTH="80%" SIZE=2></DIV>
	<DIV CLASS="center">
	<TABLE CELLPADDING=10>
<TR><TD BGCOLOR="#DB9370">
	

The trace lines displayed by the tracer has the following:

	<TABLE CELLPADDING=10>
<TR><TD BGCOLOR="#CCCCFF">
	<BLOCKQUOTE CLASS="quote"><PRE>

 +(22) 14 *EXIT&lt;3&gt;  inform_colour(1, 1)

 1&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;3 4&nbsp;&nbsp;&nbsp;5 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7

</PRE></BLOCKQUOTE></TD>
</TR></TABLE>
<OL CLASS="enumerate" type=1><LI CLASS="li-enumerate">
A '+' displayed here shows that the procedure has a spy point
 set. For a CALL port, a '#' could be displayed in this position, which
 shows a breakpoint is set for the call.
<LI CLASS="li-enumerate">The invocation number of this goal, which uniquely
 identifies it. The `To Invoc:' button can be used to jump to the next port with
 the specified invocation number. 
<LI CLASS="li-enumerate">The depth of the goal, i.e. the number of its ancestors.
The `To Depth:' button can be used to jump to the next port within the specified
depth range.
<LI CLASS="li-enumerate">An asterisk before an EXIT means that this
procedure is nondeterministic and that it might be resatisfied.
<LI CLASS="li-enumerate">The type of the port. The `To Port:' button can be used to
 select the type of port to jump to.
<LI CLASS="li-enumerate">This only appears if the goal is executing at a different priority
 than 12, the normal priority. The number is
 the priority that the goal is executed at. 
<LI CLASS="li-enumerate">The goal is printed according to the current instantiations
of its variables. 
</OL>


	</TD>
</TR></TABLE>
	</DIV>
	<BR>
<BR>
<DIV CLASS="center">Figure 5.3: Debugger Trace Line</DIV><BR>
<BR>

	<DIV CLASS="center"><HR WIDTH="80%" SIZE=2></DIV></BLOCKQUOTE>
The tracer tool traces the execution of the program, like the traditional
Prolog debugger, it stops at `debug ports' of predicates that are
executed.

<DL CLASS="description" COMPACT=compact><DT CLASS="dt-description">
<B>&#8857;</B><DD CLASS="dd-description"> <FONT COLOR="#9832CC">See the Debugging chapter in the User Manual for more details on the
 model used in Prolog debuggers.</FONT>
</DL>

At the start of tracing,
it is stopped at the call port of the query <CODE>colour</CODE>. The buttons in
the middle of the tool are for debugger commands. Try pressing
<TT>Creep</TT> several times, and you should observe something similar to
Figure&nbsp;<A HREF="#tktracer">5.2</A>. Unlike the traditional debugger, the execution trace
is shown on two text windows: the bottom `Source Context' view, showing the
execution of the program in the context of the source, highlighting the
body goal that corresponds to the goal at the debug port; and the
top `Call Stack' window, showing the ancestors (`call stack') of the
current goal, which is updated at each debug port. The goals are
displayed with different colours: blue for a call port, green (success) for
an exit port. Red (failure) for a fail port. Note that in the call
stack, the ancestor goals are displayed in black: this indicates that the
goal is not `current', i.e. the bindings shown are as they were when the
goal was called, and not necessarily what they are now. We will show how
these bindings can be `refreshed' later on. Note that the bottom windowc
can ne switched between the source context view, and a more traditional
`Trace Log' view, which shows a log of the debugger ports much as a traditional Prolog debugger does.<BR>
<BR>
To avoid stepping through the whole program, we will add a spy-point to a
predicate that may be causing the problem. Spy-points can be added in the
traditional way, using the <CODE>spy/1</CODE> predicate. However, we can also use
the <B>predicate browser</B> tool: start the <TT>Predicate Browser</TT> tool
from the <TT>Tools</TT> menu of TkECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP>. This tool allows you to observe
and change various properties of the predicates in your program.
A list of predicates are displayed
on the left hand side, and a list of properties on the right.
Currently the predicate list is showing all the predicates defined in our program (i.e. in
the <CODE>eclipse</CODE> module). Looking at this list,
<CODE>not_same_colour/3</CODE>'s name suggests that
it checks that neighbouring countries do not have the same colour.
Select it by clicking on it, and now the right
hand side should display the properties of this predicate:<BR>
<BR>
<DIV CLASS="center">
<IMG SRC="tutorial006.gif"><BR>
<BR>
<BR>

<B>The Predicate Browser Tool</B>
</DIV>
<A NAME="@default126"></A><BR>
<BR>
We can now view the source code for the predicate by clicking on the
<TT>Show source</TT> button, which will show the selected predicate's source in
the source context view. The code for the predicate is:<BR>
<BR>

	<TABLE CELLPADDING=10>
<TR><TD BGCOLOR="#CCCCFF">
	<BLOCKQUOTE CLASS="quote"><PRE>
not_same_colour(Solver, C1-C2, Countries) :-
      % get the colours for the countries C1 and C2
      arg(C1, Countries, Colour1),
      arg(C2, Countries, Colour2),
      % send constraint to either the fd or ic solver
      Solver: (Colour1 #<CODE>\</CODE>= Colour2).
</PRE></BLOCKQUOTE></TD>
</TR></TABLE><BR>
The code does indeed check that the countries <CODE>C1</CODE> and <CODE>C2</CODE> do
not have the same colour.<BR>
<BR>

<TABLE CELLPADDING=10>
<TR><TD BGCOLOR="#CCFFCC">
<DL CLASS="description" COMPACT=compact><DT CLASS="dt-description">
<B>&otimes;</B><DD CLASS="dd-description"> For our example program, the list is not very long, but some programs may
have many predicates, and it could be difficult to find the predicate you
want. The predicate list has a search facility: typing in part of the name
of the predicate in the predicate list will search for the predicate you
want. You can try typing in <TT>not_same_colour / 3</TT> to see how this
works.
</DL>
</TD>
</TR></TABLE>
<BR>
The predicate browser allows us to change some of the properties of a predicate.
We can add a spy-point to the predicate by clicking on the radio button for
<B>spy</B>: <BR>
<BR>
<DIV CLASS="center">
<IMG SRC="tutorial007.gif"><BR>
<BR>
<BR>

<B>Setting Spy Property to On</B>
</DIV><BR>
<BR>
With TkECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP>, we can do more than just place a spy point on a
predicate: we can specify further conditions for when the tracer should
stop at a spy point, using the filter tool. <BR>
<BR>
Start the filter tool by selecting <TT>Configure filter</TT> from the <TT>Options</TT> menu of the tracer
tool:<BR>
<BR>
<DIV CLASS="center">
<IMG SRC="tutorial008.gif"><BR>
<BR>
<BR>

<B>Starting the Filter Tool from the Tracer</B>
</DIV>
<BLOCKQUOTE CLASS="figure"><DIV CLASS="center"><HR WIDTH="80%" SIZE=2></DIV>
<DIV CLASS="center">
<IMG SRC="tutorial009.gif">
</DIV>
<BR>
<BR>
<DIV CLASS="center">Figure 5.4: The Tracer Filter Tool</DIV><BR>
<BR>

<A NAME="tkfilter"></A>
<DIV CLASS="center"><HR WIDTH="80%" SIZE=2></DIV></BLOCKQUOTE>
The filter tool opens in a new window, as shown in
Figure&nbsp;<A HREF="#tkfilter">5.4</A>. This tool allows us to specify a `filter' for the
debug ports so that the tracer will only stop at a port with the properties
specified by the tool. In our case, we want to see <CODE>not_same_colour/3</CODE>
only when countries 3 and 4 are involved. This can be done 
with the &#8220;Predicate specification&#8221; facility, enabled by the
<TT>Specific predicate instance:</TT> radio button. Pressing this button
will allow us to specify a condition in Prolog syntax which will be
checked at each debug port. For our purpose, we enter the following:<BR>
<BR>
<DIV CLASS="center">
<IMG SRC="tutorial010.gif"><BR>
<BR>
<BR>

<B>Setting Conditions for Specific Predicate Instances</B>
</DIV><BR>
<BR>
<A NAME="@default127"></A>
<A NAME="@default128"></A>
This specifies that the filter should stop at a <CODE>not_same_colour/3</CODE>
goal, when one of the countries in the pair <CODE>X-Y</CODE> is country 4: the <B>Goal template</B> is used to specify the template the debug port goal should
match, and the <B>Condition:</B> can be any ECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP> goal, perhaps with variables
from the <B>Goal template</B>, as in our case. The test is done by unifying
the goal with the template, and then executing the condition. Note that any
bindings are undone after the test. <BR>
<BR>
Note that we have also deselected the <TT>exit</TT> port in the filter
condition. You can do this by clicking on the <TT>exit</TT> radio
button. This means that the tracer does not stop at any exit port.<BR>
<BR>
Press <TT>Go</TT> on the filter tool to start the tracer running with the
filter. You can also press the <TT>Filter</TT> command button on the tracer
to do the same thing.
We see that the tracer has jumped to a <CODE>not_same_colour/3</CODE> goal
involving country 4 as expected. However, there is a gap in the call stack
as we skipped over the tracing of some ancestor goals. We can see these
goals by <B>refreshing</B> the goal stack. This can be done by pressing and
holding down the right mouse button while the mouse cursor is over a goal
in the call stack, which will popup a menu for the goal:<BR>
<BR>
<DIV CLASS="center">
<IMG SRC="tutorial011.gif"><BR>
<BR>
<BR>

<B>Popup Menu for a Goal in Tracer's Call Stack</B>
</DIV><BR>
<BR>
In this case, we have opened the menu over <CODE>not_same_colour/3</CODE>, and the
options are for this goal. Various options are available, but for now we
choose the <TT>Refresh goal stack</TT> option. This will result in the
following goal stack display:<BR>
<BR>
<DIV CLASS="center">
<IMG SRC="tutorial012.gif"><BR>
<BR>
<B>Refreshed Call Stack</B>
</DIV><BR>
<BR>
Notice that the colour of the goals in the goal stack are now all blue,
indicating that the bindings shown are current. <BR>
<BR>
Press <TT>Filter</TT> on the tracer several times to jump to other ports
involving country 4. You will see that none of them involve countries 3 and
4. So perhaps countries 3 and 4 are not checked by
<CODE>not_same_colour/3</CODE>, i.e. <CODE>3-4</CODE> or <CODE>4-3</CODE> are never passed
to <CODE>not_same_colour/3</CODE>. Looking at the call stack, we can see that the
country pair in <CODE>not_same_colour/3</CODE> seem to appear as an element in a
list of country pairs, as far back as <CODE>colouring(...)</CODE>. Unfortunately,
the debugger does not display the whole list. We see something like:<BR>
<BR>
<DIV CLASS="center">
<CODE>do_colouring(prolog, input_order, indomain, [4 - 2, 4 - 1, ... </CODE>
</DIV> 
due to the `print depth' feature, which shortens the printing of large
terms. We can examine the whole list by using the inspector to examine the
goal. To do this, we double click on the <CODE>do_colouring(...)</CODE> goal
to `open' it for inspection.<BR>
<BR>
This will launch the Inspector tool on the <CODE>do_colouring</CODE> goal. The
inspector displays the term in a hierarchical fashion as a tree, which
allows us to navigate the term. The initial display is shown on the left
panel below. We are interested in examining the full list. We can look at
this list by double clicking on it to expand the node, which results in the
display in the right panel below. You may need to scroll
down to see the whole list:<BR>
<BR>
<DIV CLASS="center">
<IMG SRC="tutorial013.gif">
<IMG SRC="tutorial014.gif"><BR>
<BR>
<BR>

<B>Using the Inspector</B>
</DIV><BR>
<BR>
<A NAME="@default129"></A>
<A NAME="@default130"></A>
The inspector shows that this list does not contain the pair <CODE>4-3</CODE> or
<CODE>3-4</CODE>, which should be there so that <CODE>not_same_colour</CODE>
can check that these two countries are not assigned the same colour.<BR>
<BR>

The inspector tool is modal &ndash; when it is open, the rest of TkECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP> is
inaccessible. Close the Inspector by clicking on its
<TT>Close</TT> button, go back to the tracer, and see where the country
pair list comes from. It
first appears in 
the ancestor goals <CODE>do_colouring(prolog,...)</CODE>, as the next parent
<CODE>colouring(prolog,...)</CODE> does not have this list. So the list
is created in a body goal of <CODE>colouring(...)</CODE> before <CODE>do_colouring(...)</CODE> is
called. We can look at the source of <CODE>colouring(...)</CODE> to see how this
list is created. To do this, we can
select <TT>Display source</TT> option from the popup menu for the
<CODE>colouring(...)</CODE> goal:
<BR>
<BR>
<DIV CLASS="center">
<IMG SRC="tutorial015.gif"><BR>
<BR>
<BR>

<B>Displaying Source for a Goal in the Call Stack</B>
</DIV><BR>
<BR>
The code for this predicate is quite long, but for our purposes we are only
interested in the country-pair list that is passed to <CODE>do_colouring</CODE>:<BR>
<BR>

	<TABLE CELLPADDING=10>
<TR><TD BGCOLOR="#CCCCFF">
	<BLOCKQUOTE CLASS="quote"><PRE>
colouring1(Type, Select, Choice0, N, Backtracks) :-
        ....
        findall(C1-C2, (neighbour(C1,C2), C1=&lt;N,C2=&lt;N), Neighbours),
        ....
        do_colouring(Type, Select, Choice, Neighbours, Countries,
                     CountryList, Backtracks), 
        ....
</PRE></BLOCKQUOTE></TD>
</TR></TABLE><BR>
Looking at this source and the Call stack goal, we can see that the country
pair list is constructed from <CODE>neighbour/2</CODE> calls. Let's look at the
source for <CODE>neighbour/2</CODE>. We can do this from the predicate browser, by
selecting <CODE>neighbour/2</CODE> and pushing the <TT>Show source</TT> button. We see
the following:<BR>
<BR>

	<TABLE CELLPADDING=10>
<TR><TD BGCOLOR="#CCCCFF">
	<BLOCKQUOTE CLASS="quote"><PRE>
neighbour / 2 in file buggy_data.map, line 2:
%neighbour(4, 3).
neighbour(4, 2).
neighbour(4, 1).
neighbour(4, 2).
neighbour(3, 1).
neighbour(3, 2).
neighbour(1, 2).
</PRE></BLOCKQUOTE></TD>
</TR></TABLE><BR>
So <CODE>neighbour(4,3)</CODE> was indeed missing (it is commented out).
Another way to check <CODE>neighbour/2</CODE>, without looking at the source,
would be using the
Simple Query tool. This tool is again started from TkECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP>'s
<TT>Tools</TT> menu. It can be used to send simple queries to ECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP>,
even while another query is being executed (as we are here, executing the
<CODE>colour</CODE> query). We can use this tool to check if <CODE>neighbour(4,3)</CODE>
or <CODE>neighbour(3,4)</CODE> are defined or not:<BR>
<BR>
<DIV CLASS="center">
<IMG SRC="tutorial016.gif"><BR>
<BR>
<BR>

<B>The Simple Query Tool</B>
</DIV><BR>
<BR>
To send a query, simply type it in the entry window and press return, and
the reply will be sent to the reply window. In the example above, we have
tried <CODE>neighbour(4,3)</CODE>, followed by <CODE>neighbour(3,4)</CODE>, and
both failed, indicating that there is no neighbour relationship defined
between countries 3 and 4.<BR>
<BR>

 We can fix the program by editing
the file <CODE>buggy_data.map</CODE> and adding the neighbour(4, 3) line back.
TkECLiPSe does not provide an integrated editor itself, so you need to use
some external editor, such as emacs, vi, or wordpad to edit the program. 
You can tell ECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP>which editor you want to use, so that you can invoke
the editor from within ECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP>. For example, from the source context view
window of the tracer, you can invoke an editor to edit the file being
<BLOCKQUOTE CLASS="figure"><DIV CLASS="center"><HR WIDTH="80%" SIZE=2></DIV>
<DIV CLASS="center">
<IMG SRC="tutorial017.gif">
</DIV>
<BR>
<BR>
<DIV CLASS="center">Figure 5.5: Invoking an editor</DIV><BR>
<BR>

<A NAME="tkeditor"></A>
<DIV CLASS="center"><HR WIDTH="80%" SIZE=2></DIV></BLOCKQUOTE>
displayed. Holding down your right mouse button in the source context
window will popup a menu, as shown in figure&nbsp;<A HREF="#tkeditor">5.5</A>. Select &#8220;Edit
this file&#8221; option will invoke your specified editor to edit the file, and if
possible, the file will be opened showing the line where your mouse pointer
was when you popup the menu (line 24 in this example).<BR>
<BR>

<TABLE CELLPADDING=10>
<TR><TD BGCOLOR="#CCFFCC">
<DL CLASS="description" COMPACT=compact><DT CLASS="dt-description">
<B>&otimes;</B><DD CLASS="dd-description"> 
You can specify an editor to use with ECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP>using the Tkpreference
editor tool from the Tools menu. Fill in the entry for &#8220;Text editor to use&#8221;
with the editor you want to use &ndash; this should be the command that you will
type in a command line to invoke your editor. In addition, if your editor
supports it, you can fill in
the &#8220;Editor's command line option to start at a specific line&#8221; with the
command line option that will cause the editor to open the file at a
certain line.

</DL>
</TD>
</TR></TABLE>
<BR>
To run the corrected program, we first end our current debugging session by
closing the tracer window. You can see from the map display that the
execution continues until a solution is produced. 
Pressing <TT>Done</TT> on the map display will return control to
ECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP>. Alternatively, if continuing the execution is undesirable, press the <TT>Abort</TT> command button in
the tracer, which would abort the execution.
<BR>
<BR>
Once we have made the correction to the program and saved it,
we compile it by pressing the
<TT>Make</TT> button on TkECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP>. This recompiles any files that
have been updated since ECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP> last compiled the file. <BR>
<BR>
Running the program again will show that the bug is indeed fixed.<BR>
<BR>

	<BLOCKQUOTE CLASS="figure"><DIV CLASS="center"><HR WIDTH="80%" SIZE=2></DIV>
	<DIV CLASS="center">
	<TABLE CELLPADDING=10>
<TR><TD BGCOLOR="#DB9370">
	
In TkECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP>, you can usually perform these operations on an object
while the mouse cursor is over it:
<DL CLASS="description" COMPACT=compact><DT CLASS="dt-description">
<B>left-click</B><DD CLASS="dd-description"> selects the object. 
<DT CLASS="dt-description"><B>double (left)-click</B><DD CLASS="dd-description"> `opens' the object. This can mean expanding it
(e.g. in the inspector), or calling the inspector on it (e.g. on a goal in
the call stack), or showing the source for a goal (e.g. in the source
context view).
<DT CLASS="dt-description"><B>Right-click and hold</B><DD CLASS="dd-description"> Opens a menu which gives
further option/information on the object.
</DL>
Right-mouse button functionality are alternatively available through the
left-mouse button with the control key pressed.

	</TD>
</TR></TABLE>
	</DIV>
	<BR>
<BR>
<DIV CLASS="center">Figure 5.6: Mouse Button Operations on Objects</DIV><BR>
<BR>

	<DIV CLASS="center"><HR WIDTH="80%" SIZE=2></DIV></BLOCKQUOTE>

	<BLOCKQUOTE CLASS="figure"><DIV CLASS="center"><HR WIDTH="80%" SIZE=2></DIV>
	<DIV CLASS="center">
	<TABLE CELLPADDING=10>
<TR><TD BGCOLOR="#DB9370">
	
<DL CLASS="description" COMPACT=compact><DT CLASS="dt-description">
<B>Compile scratch pad</B><DD CLASS="dd-description"> allow simple programs to be written and
compiled. Equivalent to <TT>[user]</TT> in command line ECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP>.
<DT CLASS="dt-description"><B>Source file manager</B><DD CLASS="dd-description"> manage source files for this ECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP> session.
<DT CLASS="dt-description"><B>Predicate browser</B><DD CLASS="dd-description"> view/change properties of predicates.
<DT CLASS="dt-description"><B>Delayed goals</B><DD CLASS="dd-description"> view delayed goals.
<DT CLASS="dt-description"><B>Tracer</B><DD CLASS="dd-description"> debugger for ECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP> programs.
<DT CLASS="dt-description"><B>Inspector</B><DD CLASS="dd-description"> term inspector. Useful for viewing large terms.
<DT CLASS="dt-description"><B>Visualisation client</B><DD CLASS="dd-description"> start a visualisation client.
<DT CLASS="dt-description"><B>Global settings</B><DD CLASS="dd-description"> view/change global ECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP> settings.
<DT CLASS="dt-description"><B>Statistics</B><DD CLASS="dd-description"> show statistics. Information is updated dynamically.
<DT CLASS="dt-description"><B>Simple query</B><DD CLASS="dd-description"> send simple queries to ECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP>.
<DT CLASS="dt-description"><B>Library browser and help</B><DD CLASS="dd-description"> interface to ECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP> documentation.
<DT CLASS="dt-description"><B>TkECLiPSe preference editor</B><DD CLASS="dd-description"> view/change TkECL<SUP><I>i</I></SUP>PS<SUP><I>e</I></SUP> settings. 
</DL>

	</TD>
</TR></TABLE>
	</DIV>
	<BR>
<BR>
<DIV CLASS="center">Figure 5.7: Available Development tools</DIV><BR>
<BR>

	<DIV CLASS="center"><HR WIDTH="80%" SIZE=2></DIV></BLOCKQUOTE>
<HR>
<A HREF="tutorial039.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="tutorial037.html"><IMG SRC ="contents_motif.gif" ALT="Up"></A>
<A HREF="tutorial041.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
</BODY>
</HTML>
